package com.sky.dao;

import com.sky.annotation.AutoFill;
import com.sky.entity.User;
import com.sky.enumeration.OperationType;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;

/**
 * 用户信息(User)表数据库访问层
 *
 * @author lining
 * @since 2024-10-23 16:30:35
 */
@Mapper
public interface UserDao {
     /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    User queryById(Long id);
    /**
     * 通过主键修改单条数据【非空字段】
     *
     * @param user 实例对象
     * @return 影响行数
     */
    @AutoFill(value = OperationType.UPDATE)
    int updateById(User user);
    /**
     * 通过主键修改单条数据【非空所有字段】
     *
     * @param user 实例对象
     * @return 影响行数
     */
    @AutoFill(value = OperationType.UPDATE)
    int updateAllById(User user);

    /**
     * 通过主键删除单条数据
     *
     * @param id 主键
     * @return 影响行数
     */
    int deleteById(Long id);
    
    /**
     * 通过主键批量删除数据
     *
     * @param idList 主键list
     * @return 影响行数
     */
    int deleteAllByIdList(@Param("idList") List<Long> idList);
    
    /**
     * 精准查询
     *
     * @param user 实例对象
     * @return 对象列表
     */
    List<User> queryAll(User user);


    /**
     * 模糊查询
     *
     * @param user 实例对象
     * @return 对象列表
     */
    List<User> queryAllLike(User user);

    /**
     * 分页精准查询
     *
     * @param user 实例对象
     * @param pageSize 每页数量
     * @param offset 起始索引
     * @return 对象列表
     */
     List<User> queryAllLimit(User user, int offset, int pageSize);

    /**
     * 分页模糊查询
     *
     * @param user 实例对象
     * @param pageSize 每页数量
     * @param offset 起始索引
     * @return 对象列表
     */
     List<User> queryAllLikeLimit(User user, int offset, int pageSize);

    /**
     * 统计总行数
     *
     * @param user 查询条件
     * @return 总行数
     */
    long count(User user);

    /**
     * 统计总行数(模糊查询)
     *
     * @param user 查询条件
     * @return 总行数
     */
    long countLike(User user);

    /**
     * 新增数据
     *
     * @param user 实例对象
     * @return 影响行数
     */
    @Options(flushCache = Options.FlushCachePolicy.TRUE)
    @AutoFill(value = OperationType.INSERT)
    int insert(User user);

    /**
     * 批量新增数据
     *
     * @param entities List<User> 实例对象列表
     * @return 影响行数
     */
    @Options(flushCache = Options.FlushCachePolicy.TRUE)
    @AutoFill(value = OperationType.INSERT)
    int insertBatch(@Param("entities") List<User> entities);

    /**
     * 通过实体精准删除数据
     *
     * @param user 实例对象
     * @return 影响行数
     */
    int deleteAll(User user);
}

